# encoding=utf-8

import warnings

warnings.filterwarnings('ignore')
#显示中文
from pylab import *  #显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei']  #显示中文
#画图中显示负号
import matplotlib

matplotlib.rcParams['axes.unicode_minus'] = False

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve,confusion_matrix,roc_auc_score,precision_score,recall_score,f1_score,accuracy_score,classification_report
import matplotlib.pylab as plt


# 利用pandas读取Mass数据集，变量说明如下：BI-RADS assessment (BI-RADS评估), Age (年龄), Shape (肿块形状), Margin (肿块边缘) ,Density (肿块密度), Severity(1 代表恶性 0 代表良性)。要求：
# 1、	读取数据集（5分）
data = pd.read_excel('Mass.xlsx',na_values='?')
# 2、	去除缺失值（5分）
data.dropna(inplace = True)
# 3、	X，y进行切分（5分）
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
# 4、	使用留出法切分数据，比例7:3（5分）
X_train, X_test, y_train, y_test = train_test_split(X,y)  #分割数据集
# 5、	进行网格搜索交叉验证
# a)	设置学习率分别为1,0.5,0.2,0.1（5分）
params = { 'C': [1, 0.5, 0.2, 0.1]}
# b)	创建逻辑回归模型（5分）
lor = LogisticRegression()
# c)	交叉验证6次（10分）
gs = GridSearchCV(lor, param_grid=params, cv =6)
# d)	拟合训练集（10分）
gs.fit(X_train,y_train)
# e)	找出最优参数（10分）
print(gs.best_params_)   #选取最好的参数
# 6、	利用最优参数创建模型，进行拟合，预测（10分）
best_lor = LogisticRegression(C = 1)
best_lor.fit(X_train,y_train)
y_pred = best_lor.predict(X_test)          #预测值
# 7、	打印输出准确率，召回率，精确率（10分）
print('准确率：',accuracy_score(y_test,y_pred))
print('精确率：',precision_score(y_test,y_pred))
print('召回率：',recall_score(y_test,y_pred))
print('f1-score:',f1_score(y_test,y_pred))
# 8、	打印分类报告，混淆矩阵（10分）
print('混淆矩阵：\n',confusion_matrix(y_test,y_pred))
print('分类报告：\n',classification_report(y_test,y_pred))
# 9、	打印AUC数值，绘制roc曲线（10分）
y_score = best_lor.predict_proba(X_test)   #预测的概率输出, y_score为两列,第1列为属于0的概率, 第2列为属于1的概率
print(y_score)
print('auc面积:',roc_auc_score(y_test,y_score[:,1]))

#画ROC曲线
fpr, tpr, thresholds = roc_curve(y_test,y_score[:,1])  #第2个参数为属于1的概率; fpr,tpr,thresholds 分别为假正率、真正率和阈值，是不同阈值下的假正率和真正率
plt.plot(fpr,tpr)
plt.show()
